/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.jm.financeiro.view;

import br.jm.financeiro.base.eao.EaoException;
import br.jm.financeiro.datamodel.LazyTempAcompanhamento;
import br.jm.financeiro.entity.CamposRelatorio;
import br.jm.financeiro.entity.DiagnosticoNivel1;
import br.jm.financeiro.entity.EmpreendimentoLote;
import br.jm.financeiro.entity.GetIdMax;
import br.jm.financeiro.entity.ProcessoDiagnosticoNivel1;
import br.jm.financeiro.entity.TempAcompanhamento;
import br.jm.financeiro.entity.Usuario;
import br.jm.financeiro.entity.ViewAcompanhamentoProcesso;
import br.jm.financeiro.filter.Funcoes;
import br.jm.financeiro.sistema.eao.EmpreendimentoLoteEao;
import br.jm.financeiro.sistema.eao.GetIdMaxEao;
import br.jm.financeiro.sistema.eao.TempAcompanhamentoEao;
import br.jm.financeiro.sistema.eao.ViewAcompanhamentoProcessoEao;
import java.io.IOException;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import javax.servlet.http.HttpSession;
import org.primefaces.context.RequestContext;
import org.primefaces.event.ToggleEvent;
import org.primefaces.event.TransferEvent;
import org.primefaces.model.DualListModel;
import org.primefaces.model.LazyDataModel;

/**
 *
 * @author joao
 */
public class ViewAcompanhamentoProcessoBean implements Serializable {

    private static final long serialVersionUID = 1L;
    private ViewAcompanhamentoProcesso selectedViewAcompanhamentoProcesso;
    private final ViewAcompanhamentoProcessoEao ViewAcompanhamentoProcessoEAO;
    private List<ViewAcompanhamentoProcesso> viewAcompanhamentoList;
    private int rowid;
    private TempAcompanhamento selectedTempAcompanhamento;
    private final TempAcompanhamentoEao tempAcompanhamentoEAO;
    private LazyDataModel<TempAcompanhamento> tempAcompanhamentoLazy;
    private List<TempAcompanhamento> tempAcompanhamentoList;
    private EmpreendimentoLote selectedEmpreendimentoLote;
    private final EmpreendimentoLoteEao empreendimentoLoteEAO;
    private List<EmpreendimentoLote> empreendimentoLoteList;
    private FacesMessage msg = null;
    private final Funcoes funcoes = new Funcoes();
    private FacesContext ctx;
    private GetIdMax selectedGetIdMax;
    private Map<String, Object> camposList;
    private List<GetIdMax> selectedGetIdMaxList;
    private final GetIdMaxEao getIdMaxJpa;
    private List<ProcessoDiagnosticoNivel1> selectedProcessoDiagnosticoNivel1List;
    private ProcessoDiagnosticoNivel1 selectedProcessoDiagnosticoNivel1;
    private DiagnosticoNivel1 selectedDiagnosticoNivel1;
    private boolean lgrid;
    private CamposRelatorio selectedCamposRelatorio;
    private DualListModel<CamposRelatorio> camposRelatorioPicks;
    private HttpSession session;

    public ViewAcompanhamentoProcessoBean() throws EaoException {
        ViewAcompanhamentoProcessoEAO = ViewAcompanhamentoProcessoEao.getInstance();
        tempAcompanhamentoEAO = TempAcompanhamentoEao.getInstance();
        empreendimentoLoteEAO = EmpreendimentoLoteEao.getInstance();
        getIdMaxJpa = GetIdMaxEao.getInstance();

        selectedViewAcompanhamentoProcesso = new ViewAcompanhamentoProcesso();
        selectedTempAcompanhamento = new TempAcompanhamento();
        selectedEmpreendimentoLote = new EmpreendimentoLote();
        selectedCamposRelatorio = new CamposRelatorio();

        // PickList TempAcompanhamento
        List<CamposRelatorio> source = new ArrayList<>();
        List<CamposRelatorio> target = new ArrayList<>();

        source.add(new CamposRelatorio(9, "nom_fantasia", "Cliente"));
        source.add(new CamposRelatorio(3, "dsc_empreendimento", "Empreendimento"));
        source.add(new CamposRelatorio(11, "num_processo", "Processo"));
        source.add(new CamposRelatorio(5, "dsc_lote", "Assunto"));
        source.add(new CamposRelatorio(4, "dsc_id_lote", "Lote"));
        source.add(new CamposRelatorio(6, "dsc_orgao", "Unidade"));
        source.add(new CamposRelatorio(7, "loc_dat_desde", "Desde"));
        source.add(new CamposRelatorio(12, "sit_descricao", "Situação"));
        source.add(new CamposRelatorio(12, "loc_transito", "Transito"));
        source.add(new CamposRelatorio(8, "loc_funciionario", "Funcionário"));
        source.add(new CamposRelatorio(10, "nom_tecnico", "Nome do Técnico"));
        source.add(new CamposRelatorio(2, "dpt_responsavel", "Depto.Responsavel"));
        source.add(new CamposRelatorio(1, "dat_update", "Data Atualização"));

        //source.add(new CamposRelatorio("dsc_obs", ""));
        //source.add(new CamposRelatorio("acompanhamento_id", "id"));
        //source.add(new CamposRelatorio("id_empreendimento_lote", ""));
        camposRelatorioPicks = new DualListModel<>(source, target);

        tempAcompanhamentoLazy = new LazyTempAcompanhamento(tempAcompanhamentoEAO);
    }

    public int getRowid() {
        return rowid;
    }

    public void setRowid(int rowid) {
        this.rowid = rowid;
    }

    public TempAcompanhamento getSelectedTempAcompanhamento() {
        return selectedTempAcompanhamento;
    }

    public void setSelectedTempAcompanhamento(TempAcompanhamento selectedTempAcompanhamento) {
        this.selectedTempAcompanhamento = selectedTempAcompanhamento;
    }

    public LazyDataModel<TempAcompanhamento> getTempAcompanhamentoLazy() {
        return tempAcompanhamentoLazy;
    }

    public void setTempAcompanhamentoLazy(LazyDataModel<TempAcompanhamento> tempAcompanhamentoLazy) {
        this.tempAcompanhamentoLazy = tempAcompanhamentoLazy;
    }

    public void geraRelatorio(ActionEvent event) {
        ctx = FacesContext.getCurrentInstance();
        RequestContext context = RequestContext.getCurrentInstance();
        session = (HttpSession) ctx.getExternalContext().getSession(false);
        Usuario usuario = (Usuario) session.getAttribute("usuarioAutenticado");
        msg = null;
        String cFiltro;
        String cOrder = "";

        try {
            // Limpa Relatorio
            String cSql = "delete from temp_acompanhamento where id_usuario = ".concat(usuario.getIdUsuario().toString());

            tempAcompanhamentoEAO.executeUpdate(cSql, null, null);

            empreendimentoLoteList = empreendimentoLoteEAO.getNative("EmpreendimentoLote", 0, empreendimentoLoteEAO.getCount("EmpreendimentoLote"), "numProcesso", true, null, null);

            for (EmpreendimentoLote empreendimentoLoteList1 : empreendimentoLoteList) {
                selectedEmpreendimentoLote = empreendimentoLoteList1;
                cFiltro = " id_empreendimento_lote = " + selectedEmpreendimentoLote.getIdEmpreendimentoLote();
                viewAcompanhamentoList = ViewAcompanhamentoProcessoEAO.getNative("ViewAcompanhamentoProcesso", 0, ViewAcompanhamentoProcessoEAO.getCount("ViewAcompanhamentoProcesso"), null, false, null, null, cFiltro);
                if (viewAcompanhamentoList.size() > 0) {
                    this.selectedViewAcompanhamentoProcesso = viewAcompanhamentoList.get(0);

                    // PEGA AS 10 LINHAS FINAIS DO CAMPO OBS
                    String[] cDscObsTemp = funcoes.TiraNull(this.selectedViewAcompanhamentoProcesso.getDscObs()).split("\n");
                    // Arrays.sort(cDscObsTemp, Collections.reverseOrder());
                    String cDscObs = "";
                    int count = cDscObsTemp.length;

                    if (count >= 10) {
                        count = cDscObsTemp.length - 6;
                    } else {
                        count = 0;
                    }

                    for (int j = count; j < cDscObsTemp.length; j++) {
                        cDscObs += cDscObsTemp[j];
                    }

                    this.selectedTempAcompanhamento = new TempAcompanhamento();

                    this.selectedTempAcompanhamento.setAcompanhamentoId(null);
                    this.selectedTempAcompanhamento.setDatUpdate(this.selectedViewAcompanhamentoProcesso.getDatUpdate());
                    this.selectedTempAcompanhamento.setDptResponsavel(funcoes.TiraNull(this.selectedViewAcompanhamentoProcesso.getDptResponsavel()).toUpperCase());
                    this.selectedTempAcompanhamento.setDscEmpreendimento(funcoes.TiraNull(this.selectedViewAcompanhamentoProcesso.getDscEmpreendimento()).toUpperCase());
                    this.selectedTempAcompanhamento.setDscLote(funcoes.TiraNull(this.selectedViewAcompanhamentoProcesso.getDscAssunto()).toUpperCase());
                    this.selectedTempAcompanhamento.setDscOrgao(funcoes.TiraNull(this.selectedViewAcompanhamentoProcesso.getLocUnidade()).toUpperCase());
                    this.selectedTempAcompanhamento.setLocDatDesde(this.selectedViewAcompanhamentoProcesso.getLocDatDesde());
                    this.selectedTempAcompanhamento.setLocFunciionario(funcoes.TiraNull(this.selectedViewAcompanhamentoProcesso.getLocFunciionario()).toUpperCase());
                    this.selectedTempAcompanhamento.setNomFantasia(funcoes.TiraNull(this.selectedViewAcompanhamentoProcesso.getNomFantasia()).toUpperCase());
                    this.selectedTempAcompanhamento.setNomTecnico(funcoes.TiraNull(this.selectedViewAcompanhamentoProcesso.getNomTecnico()).toUpperCase());
                    this.selectedTempAcompanhamento.setNumProcesso(this.selectedViewAcompanhamentoProcesso.getNumProcesso());
                    this.selectedTempAcompanhamento.setSitDescricao(funcoes.TiraNull(this.selectedViewAcompanhamentoProcesso.getSitDescricao()).toUpperCase());
                    this.selectedTempAcompanhamento.setDscObs(cDscObs);
                    this.selectedTempAcompanhamento.setDscIdLote(this.selectedViewAcompanhamentoProcesso.getDscidlote());
                    this.selectedTempAcompanhamento.setIdEmpreendimentoLote(this.selectedViewAcompanhamentoProcesso.getIdEmpreendimentoLote());
                    this.selectedTempAcompanhamento.setLocTransito(this.selectedViewAcompanhamentoProcesso.getLocTransito());
                    this.selectedTempAcompanhamento.setIdUsuario(usuario);

                    tempAcompanhamentoEAO.create(selectedTempAcompanhamento);
                }
            }
            // PEGA OS AGRUPAMENTOS
            session.removeAttribute("filtroOrder");
            session.removeAttribute("filtroOrderLazy");
            if (camposRelatorioPicks.getTarget().size() > 0) {
                cOrder = " ORDER BY ";
                int nOrder = 1;
                int nTotal = camposRelatorioPicks.getTarget().size();

                for (CamposRelatorio campos : camposRelatorioPicks.getTarget()) {
                    cOrder += campos.getCampo();

                    if (nOrder < nTotal) {
                        cOrder += ", ";
                    } else {
                        cOrder += " ";
                    }
                    ++nOrder;
                }
            } else {
                cOrder = " ORDER BY nom_fantasia, dsc_orgao, nom_tecnico ";
            }
            session.setAttribute("filtroOrder", cOrder);
            session.setAttribute("filtroOrderLazy", cOrder);
            msg = new FacesMessage(FacesMessage.SEVERITY_INFO, "Geração do Relatório efetuado com Sucesso!", "");

            ctx.getExternalContext().redirect(ctx.getExternalContext().getRequestContextPath() + "/relatorios/relatorio_acompanhamento_processo.jsf");
        } catch (EaoException | IOException ex) {
            msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Erro ao Gerar o Relatório!", ex.getMessage());
        } finally {
            FacesContext.getCurrentInstance().addMessage(null, msg);
            context.update("frmAcompanhamentoProcesso:panel");
            context.update("frmAcompanhamentoProcesso:multiAcompanhamentos");
            context.update("frmAcompanhamentoProcesso:messages");
        }
    }

    public void reportCreate() throws IOException {
        session = (HttpSession) FacesContext.getCurrentInstance().getExternalContext().getSession(false);
        msg = null;
        String url = "/relatorio?tipRel=acompanhamento";
        session.setAttribute("tipRel", "acompanhamento");
        FacesContext context = FacesContext.getCurrentInstance();
        try {
            msg = new FacesMessage(FacesMessage.SEVERITY_INFO, "Geração do Relatório efetuado com Sucesso!", "");
            context.getExternalContext().dispatch(url);
        } catch (IOException e) {
            msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Erro ao Gerar o Relatório!", e.getMessage());
        } finally {
            FacesContext.getCurrentInstance().addMessage(null, msg);
            context.responseComplete();
        }

    }

    public void onRowToggle(ToggleEvent event) {
        this.selectedTempAcompanhamento = (TempAcompanhamento) event.getData();
        try {
            selectedEmpreendimentoLote = empreendimentoLoteEAO.getPorId(this.selectedTempAcompanhamento.getIdEmpreendimentoLote());

            if (this.selectedEmpreendimentoLote.getProcessoDiagnosticoNivel1List() != null) {
                if (!this.selectedEmpreendimentoLote.getProcessoDiagnosticoNivel1List().isEmpty()) {
                    this.lgrid = true;

                }
            }
        } catch (Exception ex) {
            //Logger.getLogger(ViewAcompanhamentoProcessoBean.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    public boolean isLgrid() {
        return lgrid;
    }

    public void setLgrid(boolean lgrid) {
        this.lgrid = lgrid;
    }

    public DualListModel<CamposRelatorio> getCamposRelatorioPicks() {
        return camposRelatorioPicks;
    }

    public void setCamposRelatorioPicks(DualListModel<CamposRelatorio> camposRelatorioPicks) {
        this.camposRelatorioPicks = camposRelatorioPicks;
    }

    public CamposRelatorio getSelectedCamposRelatorio() {
        return selectedCamposRelatorio;
    }

    public void setSelectedCamposRelatorio(CamposRelatorio selectedCamposRelatorio) {
        this.selectedCamposRelatorio = selectedCamposRelatorio;
    }

    public void handleAcompanhamentoChange(TransferEvent event) {
        ctx = FacesContext.getCurrentInstance();
        session = (HttpSession) ctx.getExternalContext().getSession(false);
        session.removeAttribute("filtroOrder");
    }
}
